﻿package com.view;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * 记事本的界面
 * 
 * @author Administrator
 *
 */
public class JiShiBenView {

	// 本对象
	private JiShiBenView jiShiBen = null;

	// 记事本的主界面
	private JFrame jFrame = null;

	// 记事本的菜单栏
	private JMenuBar menuBar = null;

	// 定义开始菜单
	private JMenu start = null;

	// 定义打开菜单项
	private JMenuItem open = null;

	// 定义保存菜单项
	private JMenuItem saveMenu = null;

	// 定义另存为菜单项
	private JMenuItem saveAsMenu = null;

	// 定义查找和替换的菜单项
	private JMenuItem find = null;

	// 文本框
	private JTextArea txt = null;

	// 定义一个滚动条
	private JScrollPane scroll = null;

	// 定义打开的文件
	private File file = null;

	// 定义事件监听器
	private MenuClick menuClick = null;

	// 定义文件选择器
	private JFileChooser fileChooser = null;

	// 定义查找界面
	private Find findView = null;

	// 初始化记事本的界面
	public JiShiBenView() {

		jiShiBen = this;

		// 实例化记事本并设置标题
		jFrame = new JFrame("记事本");
		
		
		//ImageIcon icon=new ImageIcon(new ImageIcon(JiShiBenView.class.getResource("/imgs/minisite.jpg")).getImage());
		
		//jFrame.setIconImage(icon.getImage());

		// 记事本的菜单栏
		menuBar = new JMenuBar();

		// 实例化记事本的各个菜单
		start = new JMenu("开始");

		// 实例化菜单项
		open = new JMenuItem("打开");
		saveMenu = new JMenuItem("保存");
		saveAsMenu = new JMenuItem("另存为");
		find = new JMenuItem("查找与替换");

		// 将菜单项添加到菜单上面
		start.add(open);
		start.add(saveMenu);
		start.add(saveAsMenu);
		start.add(find);

		// 实例化事件监听器
		menuClick = new MenuClick();

		// 设置每个菜单项的标志
		open.setActionCommand("open");
		saveMenu.setActionCommand("save");
		saveAsMenu.setActionCommand("saveAs");
		find.setActionCommand("find");

		// 注册菜单项的事件监听
		open.addActionListener(menuClick);
		saveMenu.addActionListener(menuClick);
		saveAsMenu.addActionListener(menuClick);
		find.addActionListener(menuClick);

		// 将菜单添到菜单栏上面
		menuBar.add(start);

		// 将菜单栏添加到界面上
		jFrame.setJMenuBar(menuBar);

		// 实例化文本框
		txt = new JTextArea();

		// 实现自动换行
		txt.setLineWrap(true);

		// 实例化滚动条
		scroll = new JScrollPane(txt);

		// 添加文本框到界面上
		jFrame.add(scroll);

		// 实例化文件选择器
		fileChooser = new JFileChooser();

		// 设置记事本的关闭按钮的功能
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 设置记事本的大小
		jFrame.setSize(600, 500);
		// 设置居中
		jFrame.setLocationRelativeTo(null);
		// 设置记事本的显示
		jFrame.setVisible(true);

	}

	/**
	 * 内部类充当监听器，监听按钮的点击
	 * 
	 * @author Administrator
	 *
	 */
	class MenuClick implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			if (arg0.getActionCommand().equals("open")) {
				// 打开
				String filePath = openChooser();
				if (filePath != null) {
					open(filePath);
				}
			} else if (arg0.getActionCommand().equals("save")) {
				// 保存
				save();
				
			} else if (arg0.getActionCommand().equals("saveAs")) {
				// 另存为
				String filePath = saveChooser();
				if (filePath != null) {
					file = new File(filePath);
					save();
				}
				
			} else if (arg0.getActionCommand().equals("find")) {
				// 查找和替换
				if (findView == null) {
					findView = new Find(jiShiBen);
				} else {
					findView.show();
				}
			}

		}

	}

	/**
	 * 文件打开选择器
	 * 
	 * @return
	 */
	private String openChooser() {
		// 设置文件选择器的标题
		fileChooser.setDialogTitle("打开文件...");

		// 弹出选择器
		int returnVal = fileChooser.showOpenDialog(null);

		// 如果选择了文件
		if (JFileChooser.APPROVE_OPTION == returnVal) {
			return fileChooser.getSelectedFile().toString();
		} else {
			return null;
		}
	}

	/**
	 * 文件保存选择器
	 * 
	 * @return
	 */
	private String saveChooser() {
		fileChooser = new JFileChooser();
		fileChooser.setDialogTitle("保存");
		fileChooser.setDialogType(JFileChooser.FILES_ONLY);
		fileChooser.setMultiSelectionEnabled(false);
		fileChooser.showSaveDialog(fileChooser);
		if (fileChooser.getSelectedFile() == null) {
			return null;
		} else {
			return fileChooser.getSelectedFile().getPath();
		}
	}

	/**
	 * 打开指定文件的内容
	 * 
	 * @param path
	 */
	private void open(String path) {

		// 定位文件
		file = new File(path);

		// 定义文件流
		FileReader fileReader = null;

		// 读取
		try {
			// 读取文件
			fileReader = new FileReader(file);
			txt.setText("");
			// 设置缓冲区
			char[] ch = new char[512];
			while ((fileReader.read(ch)) != -1) {
				String str = new String(ch);
				txt.append(str);
			}
		} catch (Exception e) {
			
			e.printStackTrace();
		}

		try {
			fileReader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 保存现在编辑的文件
	 */
	public void save() {
		// 获得文本框的字符
		String str = txt.getText();

		// 字符输出流
		FileWriter fileWriter = null;

		// 判断文件是否为空
		if (file == null) {
			String filePath = saveChooser();
			if (filePath != null) {
				file = new File(filePath);
			}
		}

		if (file != null) {
			// 写入文件
			try {

				// 设置输出的路径
				fileWriter = new FileWriter(file);

				// 输出文件
				fileWriter.write(str);

				// 关闭输出流
				fileWriter.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	// 让窗口获得焦点
	public void showView() {
		jFrame.setState(JFrame.NORMAL);
		jFrame.setVisible(true);
	}

	public JiShiBenView getJiShiBen() {
		return jiShiBen;
	}

	public void setJiShiBen(JiShiBenView jiShiBen) {
		this.jiShiBen = jiShiBen;
	}

	public JFrame getjFrame() {
		return jFrame;
	}

	public void setjFrame(JFrame jFrame) {
		this.jFrame = jFrame;
	}

	public JTextArea getTxt() {
		return txt;
	}

	public void setTxt(JTextArea txt) {
		this.txt = txt;
	}
	

}
